Skip to content

Conversation

amartya4256
Copy link
Contributor

This PR improves thes design implementation for widgets in win32 by moving away from DPIZoomChangeRegistry to an event-driven design using ZoomChanged event and inheritance.

contributes to
#62 and #128

This commit improves thes design implementation for widgets in win32 by
moving away from DPIZoomChangeRegistry to an event-driven design using
ZoomChanged event and inheritance.

contributes to
eclipse-platform#62 and
eclipse-platform#128
Copy link
Contributor

github-actions bot commented Sep 2, 2025

Test Results

   546 files  ±0     546 suites  ±0   27m 45s ⏱️ - 10m 33s
 4 426 tests ±0   4 409 ✅ ±0   17 💤 ±0  0 ❌ ±0 
16 750 runs  ±0  16 623 ✅ ±0  127 💤 ±0  0 ❌ ±0 

Results for commit 85b3b74. ± Comparison against base commit b66033b.

Copy link
Contributor

@HeikoKlare HeikoKlare left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a bit confused by this change, as it introduces a mixture of event processing and direct method calls for DPI change processing. I expected the following order of changes according to what we have discussed:

  1. Replace CommonWidgetsDPIChangeHandler: use listeners instead
  2. Replace DPIZoomChangeRegistry: make direct calls of handleDPIChange for the native controls instead
  3. Replace direct handleDPIChange calls: use listeners instead
  4. Make the listener calls asynchronous (may be combined with the previous step)

This change seems to be a mixture of the first three. Can we please split that up and make the changes in a more incremental, comprehensive way?

for (TreeItem item : treeItem.getItems()) {
DPIZoomChangeRegistry.applyChange(item, newZoom, scalingFactor);
for (TreeItem item : getItems()) {
item.notifyListeners(SWT.ZoomChanged, event);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be a directcall to handleDPIChange for now?

@@ -191,6 +190,14 @@ public Widget (Widget parent, int style) {
reskinWidget ();
notifyCreationTracker();
this.setData(DATA_NATIVE_ZOOM, this.nativeZoom);
registerDPIChangeListener();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With this PR, we stick to the synchronous processing of the event via direct methods calls, so no need to aready add this listener, right?

Comment on lines +2032 to +2036
private void handleCComboDPIChange(Event event) {
updateAndRefreshChildren(childWidget -> {
childWidget.notifyListeners(SWT.ZoomChanged, event);
});
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This intermediate method can be removed by directly making the notifications in the update method.

Comment on lines +176 to +178
addListener(SWT.ZoomChanged, event -> {
handleCComboDPIChange(event);
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
addListener(SWT.ZoomChanged, event -> {
handleCComboDPIChange(event);
});
addListener(SWT.ZoomChanged, this::handleCComboDPIChange);

@@ -2026,19 +2029,24 @@ public boolean traverse(int event){
return super.traverse(event);
}

private void handleCComboDPIChange(Event event) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
private void handleCComboDPIChange(Event event) {
private void handleDPIChange(Event event) {

styledText.setCaretLocations();

caretSet.stream().filter(Objects::nonNull).forEach(caretToRefresh -> {
((Caret) caretToRefresh).notifyListeners(SWT.ZoomChanged, event);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The set is already types as Caret, so why cast to Caret here again?

}
composite.redrawInPixels (null, true);
// redrawInPixels (null, true);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove

private static void handleDPIChange(Widget widget, int newZoom, float scalingFactor) {
widget.nativeZoom = newZoom;
widget.setData(DATA_NATIVE_ZOOM, newZoom);
void handleDPIChange(Event event, float scalingFactor) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why change the signature here instead of sticking to the existing parameters?

for (int i = 0; i < tabFolder.getItemCount(); i++) {
DPIZoomChangeRegistry.applyChange(tabFolder.items[i], newZoom, scalingFactor);
for (int i = 0; i < getItemCount(); i++) {
items[i].notifyListeners(SWT.ZoomChanged, event);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be items[i].handleDPIChange(...) for now?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Design improvement for Win32 Widget scaling
2 participants